package cn.tutou.tw.ck;

import java.lang.reflect.Method;

public class AppRef {
    public static void main(String[] args) throws Exception{
        // 类的完整限定名 = 包名 + 类名
        // 加载指定名称（类的完整限定名）的类
        // 成功加载后，得到的 C 可以代表 User 类本身，称之为类对象
        // 补：当泛型对象未知或不确定的时候，可以使用 ？ 表示，例如：<?>
        Class<?> C = Class.forName("cn.tutou.tw.ck.User");
        // 【实例化】u 就是 User 类的实例，也是 User 类的对象
        // 使用类对象 C 的 newInstance 方法生成 User 类的实例
        // >>> 这一行代码相当于 User u = new User();
        Object u = C.newInstance();
        // 【写】通过实例 u 的 setName 方法来为其 name 属性赋值
        // 使用类对象 C 的 getMethod 方法来查找 User 类中的 setName 方法
        // 查找成功后，得到的 setName 可以代表 User 类中的 setName 方法，称之为方法对象
        // getMethod 的第一个参数是：被查找的方法的名称
        // getMethod 的第二个及其后面所有的参数数据类型和被查找的方法中参数的数据类型保持一致
        Method setName = C.getMethod("setName", String.class);
        // 使用方法对象的 invoke 方法来调用该方法
        // invoke 的第一个参数是：调用对象，也就是类的实例
        // invoke 的第第二个及其后面所有的参数，根据具体情况传值即可
        // >>> 这一行代码相当于 u.setName("Timor");
        setName.invoke(u,"Mike");
        // 【读】通过实例 u 的 getName 方法来获取其 name 属性的值
        Method getName = C.getMethod("getName");
        Object name = getName.invoke(u);

    }
}
